#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMouseEvent>
#include <QWheelEvent>
#include <QHBoxLayout>
#include <QKeyEvent>
#include <QDateTime>
#include <QTimer>





Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);


    setWindowTitle("Qt事件");

    //捕获鼠标：
    setMouseTracking(true);


    /*              测试事件响应      有影响；
    QHBoxLayout* mainLayout = new QHBoxLayout(this);
    textEdit = new QTextEdit(this);
    mainLayout->addWidget(textEdit);

    //设置布局，可以不用每次都用下面的函数的，在申请QHBoxLayout内存时加上this参数，就可以实现全局布局
    //setLayout(mainLayout);
    */

    //获取当前时间：
    QDateTime  dateTime = QDateTime::currentDateTime();
    QString time_str = dateTime.toString("当前时间:yyyy-MM-dd  HH:mm:ss");
    setWindowTitle(time_str);       //打印到标题上    静态的     想要时间动态，就开启定时器

    //第一种创建定时器的方法：
    //开启定时器:
    time_id1 = startTimer(1000);       //ms = 1s；   每1000ms触发一次定时器
    time_id2 = startTimer(500);         //ms = 500ms;
    //按钮：
    Button = new QPushButton("停止定时器",this);
    resize(600,300);        //重新调整窗口大小
    //关联定时器的信号槽：
    connect(Button,SIGNAL(clicked(bool)),this,SLOT(buttonClickedSlot()));


    //第二种创建定时器的方法：
    timer = new QTimer(this);
    //关联定时器的信号槽：
    connect(timer,&QTimer::timeout,this,&Widget::timerSlot);

    timer->start(1000);     //开启定时器     1000ms触发一次；

}

Widget::~Widget()
{
    delete ui;
}

void Widget::buttonClickedSlot()
{
    //干掉定时器：
    killTimer(time_id1);
    killTimer(time_id2);

    //干掉第三个定时器：
    timer->stop();
}

void Widget::timerSlot()
{
    QDateTime  dateTime = QDateTime::currentDateTime();
    QString time_str = dateTime.toString("当前时间:yyyy-MM-dd  HH:mm:ss");
    qDebug()<<time_str;
}

//这个函数处理所有的事件；  但是并不是所有的事件处理都要在这个函数中执行，可以用相应的虚函数来执行相应的事件
bool Widget::event(QEvent *event)
{
//    static int i = 0;
//    qDebug()<<"事件响应 "<<i;
//    i++;

//    //鼠标处理事件：
//    if(event->type() == QEvent::MouseButtonPress)
//    {
//        static int i = 0;
//        qDebug()<<"鼠标点击"<<i;
//        i++;
//        //这个函数鼠标哪个键点击都能触发；

//        //把event强制转换成QMouseEvent* 类型：
//        QMouseEvent* mouseEvent = (QMouseEvent*) event; //用mouseEvent来判断是鼠标的哪个键：
//        if(mouseEvent->button() == Qt::LeftButton)  //左键按下
//        {
//             qDebug()<<"鼠标左键点击";
//        }
//        else if(mouseEvent->button() == Qt::RightButton)    //右键
//        {
//            qDebug()<<"鼠标右键点击";
//        }
//        else if(mouseEvent->button() == Qt::MidButton)      //中键
//        {
//            qDebug()<<"鼠标中键点击";
//        }
//        return true;      //已经处理完了
//    }

    //键盘事件：
//    if(event->type() == QEvent::KeyPress)   //按下
//    {
//        qDebug()<<"键盘按下";
//    }


    return QWidget::event(event);
}



void Widget::mousePressEvent(QMouseEvent *ev)
{
    if(ev->button() == Qt::LeftButton)
    {
        qDebug()<<"左键按下";
    }
    else if(ev->button() == Qt::RightButton)
    {
        qDebug()<<"右键按下";
    }

    //获取鼠标点击的坐标：
    // qDebug()<<"坐标>"<<ev->pos();     //牛逼啊

    //功能键：
//    if(ev->modifiers() == Qt::ALT)
//    {
//        qDebug()<<"alt";
//    }
//    else if(ev->modifiers() == Qt::CTRL)
//    {
//        qDebug()<<"ctrl";
//    }
    QString str;
        if(ev->modifiers() & Qt::AltModifier)
        {
            str += "按下了alt";
        }
        if(ev->modifiers() & Qt::ControlModifier)
        {
            str += "按下了ctrl";
        }
        if(ev->modifiers() & Qt::ShiftModifier)
        {
            str += "按下了shift";
        }
        qDebug()<<str;



    //用点击坐标来改变窗口的标题：
//    QString str = QString::asprintf("当前点击坐标为(%d-%d)",ev->pos().rx(),ev->pos().ry());
//    qDebug()<<str;
//    setWindowTitle(str);
}

void Widget::mouseReleaseEvent(QMouseEvent *ev)
{
    qDebug()<<"抬起>"<<ev->pos();
}

//鼠标移动响应    如果没有在类构造中添加setMouseTracking(true)函数是只能在鼠标左键按下的时候才响应的，添加函数就可以不用点击就响应了
void Widget::mouseMoveEvent(QMouseEvent *ev)
{
    QString str = QString::asprintf("鼠标移动到>(%d-%d)",ev->pos().rx(),ev->pos().ry());
    qDebug()<<str;
}

void Widget::mouseDoubleClickEvent(QMouseEvent *ev)
{
//    //两次点击：
//    qDebug()<<"双击";

    //如果双击的是左键，就全屏                  全屏不包括任务栏！！！！！！！
    if(ev->button() == Qt::LeftButton)
    {
        /*
        //判断：
        if(windowState() != Qt::WindowFullScreen)
            setWindowState(Qt::WindowFullScreen);   //设置窗口状态为全屏
        else
            setWindowState(Qt::WindowNoState);      //恢复
            */



        //最大化，最大化包括任务栏：
        if(windowState() != Qt::WindowMaximized)
            showMaximized();
        else
             setWindowState(Qt::WindowNoState);      //恢复

    }
    //如果双击的是右键，就恢复窗口状态
    else if(ev->button() == Qt::RightButton)
    {
        setWindowState(Qt::WindowNoState);      //恢复
    }
}

void Widget::wheelEvent(QWheelEvent *ev)
{
    //获取滚轮滚动的距离：滚定一个齿轮，转动15度，转换到的值是     —— 15*8 = 120；
            //面向我们方向滚动是负值，反方向是正值；
    int n =  ev->delta();
    qDebug()<<"滚轮滚动"<<n;

    //static int nFontsize = 16;
    if(ev->delta() > 0)
    {
        //方式1：
//        nFontsize--;
//        QFont font("微软雅黑",nFontsize);
//        textEdit->setFont(font);
        //方式2：
        textEdit->zoomIn();
    }
    else
    {
         //方式1：
//        nFontsize++;
//        QFont font("微软雅黑",nFontsize);
//        textEdit->setFont(font);
        //方式2：
        textEdit->zoomOut();
    }


}



void Widget::keyPressEvent(QKeyEvent *ev)
{
    char k = ev->key();     //捕获键值转化成char类型，但是转换到都是大写；
    qDebug()<<ev->key()<<"---"<<k;

    switch(ev->key())
    {
        case Qt::Key_Escape:
    {
            qDebug()<<"ESC";
            //最大化操作：
            if(windowState() != Qt::WindowMaximized)
                showMaximized();
            else
                setWindowState(Qt::WindowNoState);
    }
        break;
        case Qt::Key_Return:
    {
            qDebug()<<"return";
            //最小化操作：
            if(windowState() != Qt::WindowMinimized)
                showMinimized();
            else
                setWindowState(Qt::WindowNoState);
    }
        break;
        case Qt::Key_Space:
            qDebug()<<"sapce";
        break;
        case Qt::Key_F1:
            qDebug()<<"F1";
        break;
        case Qt::Key_0:
            qDebug()<<"0";
        break;
        case Qt::Key_Backspace:
            qDebug()<<"删除";
        break;
    default:
         ev->key();
        break;
    }
}

void Widget::keyReleaseEvent(QKeyEvent *ev)
{
    qDebug()<<"键盘按键弹起--"<<ev->key();

}

void Widget::timerEvent(QTimerEvent *ev)
{
    //可以处理很多的定时器


    if(ev->timerId() == time_id1)       //定时器1
    {
        //再次获取当前时间：
        QDateTime  dateTime = QDateTime::currentDateTime();
        QString time_str = dateTime.toString("当前时间:yyyy-MM-dd  HH:mm:ss");
        setWindowTitle(time_str);       //打印到标题上    动态
        //这样标题上的时间就动起来啦
    }
    else if(ev->timerId() == time_id2)      //定时器2
    {
        static int i = 0;
        qDebug()<<i;
        i++;
    }
}

void Widget::resizeEvent(QResizeEvent *ev)
{
    qDebug()<<"我要调整大小了";
}

void Widget::showEvent(QShowEvent *ev)
{
    qDebug()<<"显示了";
}

void Widget::hideEvent(QHideEvent *ev)
{
    qDebug()<<"我要隐藏了";
}

void Widget::closeEvent(QCloseEvent *ev)
{
    qDebug()<<"关闭";

    //忽略该关闭事件处理响应
    ev->ignore();

    //最小化：
    showMinimized();
}

